/**
 * Copyright © 2016-2025 The Thingsboard Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.terracloud.server.dao.log;

import com.terracloud.server.common.data.log.PlatformLog;
import com.terracloud.server.common.data.id.TenantId;
import com.terracloud.server.common.data.id.UserId;
import com.terracloud.server.common.data.id.PlatformLogId;
import com.terracloud.server.common.data.log.LogLevel;
import com.terracloud.server.common.data.log.LogType;
import com.terracloud.server.common.data.page.TimePageLink;
import com.terracloud.server.dao.Dao;

/**
 * 平台日志DAO接口
 */
public interface PlatformLogDao extends Dao<PlatformLog> {

    /**
     * 保存或更新平台日志
     *
     * @param platformLog 平台日志实体
     * @return 保存后的平台日志实体
     */
    PlatformLog save(PlatformLog platformLog);

    /**
     * 根据ID查找平台日志
     *
     * @param platformLogId 平台日志ID
     * @return 平台日志实体，如果不存在则返回null
     */
    PlatformLog findById(PlatformLogId platformLogId);

    /**
     * 根据ID删除平台日志
     *
     * @param platformLogId 平台日志ID
     */
    void removeById(PlatformLogId platformLogId);

    /**
     * 根据租户ID查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantId(TenantId tenantId, TimePageLink pageLink);

    /**
     * 根据租户ID和用户ID查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param userId 用户ID
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantIdAndUserId(TenantId tenantId, UserId userId, TimePageLink pageLink);

    /**
     * 根据租户ID和日志类型查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantIdAndType(TenantId tenantId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID和日志级别查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantIdAndLevel(TenantId tenantId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 根据租户ID、用户ID和日志类型查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param userId 用户ID
     * @param logType 日志类型
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantIdAndUserIdAndType(TenantId tenantId, UserId userId, LogType logType, TimePageLink pageLink);

    /**
     * 根据租户ID、用户ID和日志级别查找平台日志列表
     *
     * @param tenantId 租户ID
     * @param userId 用户ID
     * @param logLevel 日志级别
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByTenantIdAndUserIdAndLevel(TenantId tenantId, UserId userId, LogLevel logLevel, TimePageLink pageLink);

    /**
     * 根据状态统计平台日志数量
     *
     * @param tenantId 租户ID
     * @param status 状态
     * @return 日志数量
     */
    long countByStatus(TenantId tenantId, String status);

    /**
     * 根据是否为敏感操作统计平台日志数量
     *
     * @param tenantId 租户ID
     * @param isSensitive 是否为敏感操作
     * @return 日志数量
     */
    long countBySensitiveOperation(TenantId tenantId, boolean isSensitive);

    /**
     * 根据业务ID查找平台日志
     *
     * @param tenantId 租户ID
     * @param businessId 业务ID
     * @param pageLink 分页参数
     * @return 平台日志分页数据
     */
    com.terracloud.server.common.data.page.PageData<PlatformLog> findByBusinessId(TenantId tenantId, String businessId, TimePageLink pageLink);
}